Java进阶-equals()

Object 中的 equals 方法,设计目的:判断两个对象是否一样

1
2
3
public boolean equals (Object obj) {
return (this == obj);
}

但是比较的是内存地址,在现实的业务逻辑中,不应该比较内存地址,应该比较内容,所以 equals 方法也要重写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Text02 {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
boolean b1 = o1.equals(o2);
System.out.println(b1); // false

Star s1 = new Star(0, "张三");
Star s2 = new Star(0, "张三");
boolean b2 = s1.equals(s2);
System.out.println(b2); // true
}
}

class Star {
int id;
String name;

public Star(int id, String name) {
this.id = id;
this.name = name;
}

public boolean equals(Object obj) {
if (this == obj)
return true;

if (obj instanceof Star) {
Star s = (Star) obj;
if (s.id == id && s.name.equals(name)) {
return true;
}
}
return false;
}
}

注意:

在 Java 中比较两个字符串是否一致,不能用”==“,只能调用 String 类的 equals方法

1
2
3
4
5
6
7
8
9
10
11
12
public class Test03 {

public static void main(String[] args) {
String s1 = new String("ABC");
String s2 = new String("ABC");

System.out.println(s1 == s2); // false

// String 已经重写了 Object 的 equals 方法,比较的是内容
System.out.println(s1.equals(s2)); // true
}
}

在开发中,注意equals前后顺序,比如

1
2
3
"admin".equals(usename);
usename.equals("admin");
// 选择前面一种,可以避免空指针异常